/* 
定义函数或类时，如果对类型不确定可以使用泛型
*/
function t1<T>(i: T): T {
  return i
}
// 不指定泛型，自动推断
let i = t1("str")
// 调用时手动指定泛型
let j = t1<number>(100)
console.log(i, j)

/* 
同时指定多个泛型
*/
function t2<T, K>(i: T, j: K): T {
  console.log("j ==", j)
  return i
}
let res3 = t2(100, "我的")
console.log("res3= ", res3)

interface Inter {
  length: number
}

// 泛型必须是接口的实现类
function t3<T extends Inter>(i: T): number {
  return i.length
}
console.log(`长度: ${t3("str")}`)
export { }